package com.interpreter;

import java.util.HashMap;
import java.util.Stack;

public class Calculator {

    // 定义表达式
    public Expression expression;

    // 构造函数传参，并解析
    public Calculator(String expStr) { // expStr = a+b
        // 安排运算先后顺序
        Stack<Expression> stack = new Stack<>();
        // 表达式拆分成字符数组
        char[] charArray = expStr.toCharArray();// [a,+,b]

        Expression left = null;
        Expression right = null;
        // 遍历我们的字符数组，即遍历[a, +, b]
        // 针对不同的情况，做处理
        for(int i =0; i < charArray.length; i++){
            switch (charArray[i]) {
                case '+'://
                    left = stack.pop();// 从stack取出left => "a"
                    right = new VarExpression(String.valueOf(charArray[++i]));// 取出右表达式"b"
                    stack.push(new AddExpression(left, right)); // 然后根据得到的left和right构建AddExpression加入stack
                    break;
                case '-': //
                    left = stack.pop();
                    right = new VarExpression(String.valueOf(charArray[++i]));
                    stack.push(new SubExpression(left, right));
                    break;
                // 如果是字母，以键值的形式保留下来
                default:
                    // 如果是一个Var 就创建给VarExpression 对象，并push到stack
                    stack.push(new VarExpression(String.valueOf(charArray[i])));
                    break;
            }
        }
        this.expression = stack.pop();
    }

    public int run(HashMap<String, Integer> var) {
        // 将表达式a+b 和 var进行绑定{a=10,b=20}
        return this.expression.interpreter(var);
    }
}
